const { dir } = require('console')
const fs = require('fs')
const path = require('path')

// 创建目录
// fs.mkdir('a/b/c', { recursive: true }, err => {
//   if (!err) {
//     console.log('创建成功')
//   } else {
//     console.log(err)
//   }
// })

//   读取目录
// fs.readdir('a/b/c', (err, files) => {
//   console.log(files)
// })

// function readdirSync (dirPath) {
//   // 利用 / 分割符将路径进行拆分，将每一项放入一个数组中进行管理
//   let items = dirPath.split(path.sep)
//   var addr = '' // 定义 addr 来拼接读取目录
//   // 首先遍历遍历出指定目下所有的文件
//   for (let i = 0; i < items.length; i++) {
//     if (i === 0) {
//       addr = items[i] + ''
//     } else {
//       addr = addr + '/' + items[i]
//     }
//     // console.log(items[i], addr)
//     fs.readdir(addr, (err, files) => {
//       //   console.log(files)
//       // 遍历files数组，并读取当前目录下的文件信息
//       if (i === items.length - 1)
//         for (var j = 0; j < files.length - 1; j++) {
//           console.log(files[j])
//           // fileList.push(files[j])
//           fs.stat(files[j], (err, statObj) => {
//             // console.log(statObj)
//             //   console.log(statObj.size)
//             //   console.log(statObj.isFile())
//             //   console.log(statObj.isDirectory())
//           })
//         }
//     })
//   }
// }
// readdirSync('a\\b\\c')

// fs.stat('a/a.txt', (err, statObj) => {
//   console.log(statObj.size) // 文件大小
//   console.log(statObj.isFile()) // 是不是文件？
//   console.log(statObj.isDirectory()) // 是不是目录
// })

// // 统计文件总大小
// let fileAllSize = 0
// // 定义 addr 来拼接读取目录
// let addr = ''
// function readdirSync (dirPath) {
//   // 拼接最新目录
//   addr = addr ? addr + '/' + dirPath : dirPath
//   //   console.log('当前目录', addr)
//   // 1、首先读取目录中的内容
//   fs.readdir(addr, (err, files) => {
//     // 2、判断当前目录下是否有子目录，有的话继续遍历
//     // console.log(files)
//     // 首先遍历内容
//     for (let i = 0; i < files.length; i++) {
//       var filePath = addr + '/' + files[i]
//       //   console.log(filePath)
//       // 获取目录及文件信息
//       fs.stat(filePath, (err, statObj) => {
//         if (err) {
//           console.log(err)
//         } else {
//           fileAllSize += statObj.size
//             console.log('当前fileAllSize', fileAllSize)
//           // 如果不是文件且是目录则继续向下遍历
//           if (statObj.isDirectory() && !statObj.isFile()) {
//             readdirSync(files[i])
//           }
//         }
//       })
//     }
//   })
// }
// readdirSync('a')

// // 统计文件总大小
// let fileAllSize = 0
// let stopFlag = false
// function readdirSync (dirPath, cb) {
//   // if (stopFlag) {
//   //   console.log(dirPath, cb)
//   //   return
//   // }
//   // 1、读取传过来目录当中的内容
//   fs.stat(dirPath, (err, statObj) => {
//     if (statObj.isDirectory()) {
//       // 目录---> 继续读取
//       fs.readdir(dirPath, (err, files) => {
//         let dirs = files.map(item => {
//           return path.join(dirPath, item)
//         })
//         // 过滤空目录
//         // if (!dirs.length) return
//         let index = 0
//         console.log('读取文件', dirs, dirs.length)
//         function next () {
//           index++
//           // console.log('读取文件', index)
//           // 已到最后一个
//           if (dirs.length === index) {
//             stopFlag = true
//           }
//           for (let i = 0; i < dirs.length; i++) {
//             readdirSync(dirs[i], cb)
//           }
//         }
//         next()
//       })
//     } else {
//       // 文件---> 累加文件大小
//       fileAllSize += statObj.size
//       if (stopFlag) {
//         console.log('文件大小', fileAllSize)
//         cb()
//       }
//     }
//   })
// }
// readdirSync('a', () => {
//   console.log('统计完毕')
// })

// function a (b, cb) {
//   return cb()
// }

// a('1', () => {
//   console.log('回调完成')
// })

// // 统计文件总大小
// let fileAllSize = 0
// let stopFlag = false
// function readdirSync (dirPath, cb) {
//   // 1、读取传过来目录当中的内容
//   fs.stat(dirPath, (err, statObj) => {
//     if (statObj.isDirectory()) {
//       // 目录---> 继续读取
//       fs.readdir(dirPath, (err, files) => {
//         let dirs = files.map(item => {
//           return path.join(dirPath, item)
//         })
//         // 过滤空目录
//         // if (!dirs.length) return
//         // let index = 0
//         console.log('读取文件', dirs, dirs.length)
//         // index++
//         // console.log('读取文件', index)
//         // 已到最后一个
//         // if (dirs.length === index) {
//         //   stopFlag = true
//         // }
//         for (let i = 0; i < dirs.length; i++) {
//           readdirSync(dirs[i], cb)
//         }
//       })
//     } else {
//       // 文件---> 累加文件大小
//       fileAllSize += statObj.size
//       if (stopFlag) {
//         console.log('文件大小', fileAllSize)
//         cb()
//       }
//     }
//   })
// }

// readdirSync('a', () => {
//   console.log('统计完毕')
// })

/**
 * 思路：
 * 1、先找到所有的文件并将文件大小存入数组
 * 2、再遍历数组累加信息
 */
const readFeils = function (dirPath, filesList) {
  flies = fs.readdirSync(dirPath) // 同步读取目录中内容
  flies.forEach(item => {
    next(dirPath, item)
  })
  function next (dirPath, item) {
    const pathVal = path.join(dirPath, item)
    const states = fs.statSync(pathVal) // 同步读取目录及文件信息
    if (states.isDirectory()) {
      // 目录 -> 继续读取
      readFeils(pathVal, filesList)
    } else {
      // 文件 -> 存入数组
      filesList.push({
        size: states.size,
        name: item
      })
    }
  }
}

const getFeilsSize = function (dirPath, cb) {
  var filesList = []
  readFeils(dirPath, filesList)
  console.log('文件数组', filesList)
  let totalSize = 0
  filesList.forEach(item => {
    totalSize += item.size
  })
  cb(totalSize)
}

getFeilsSize('a', size => {
  console.log('同步统计完毕', size)
})
